<?php
// +----------------------------------------------------------------------
// | HkCms
// +----------------------------------------------------------------------
// | Copyright (c) 2012-2019 http://www.hkcms.cn, All rights reserved.
// +----------------------------------------------------------------------
// | Author: 广州恒企教育科技有限公司 <admin@hkcms.cn>
// +----------------------------------------------------------------------

namespace common\controller;

use think\Controller;
use app\api\controller\Checkcode;
use libs\system\Components;
use think\Hook;

class Hkcms extends Controller
{
    public static $Cache = [];
    private static $_app;

    public function _initialize()
    {
        $this->initSite();
    }

    public function __construct()
    {
        parent::__construct();
        self::$_app = $this;
    }

    /**
     * 处理没有的属性(私有等)
     * @param $name
     * @return mixed
     */
    public function __get($name)
    {
        if (empty($this->$name)) {
            return Components::getInstance()->$name;
        }
        return $this->$name;
    }

    /**
     * 获取HkCMS 对象
     * @return object
     */
    public static function app()
    {
        return self::$_app;
    }

    /**
     * 初始化站点配置信息
     */
    protected function initSite()
    {
        // 检测是否已经安装。
        if ($this->request->module()!='install' && !hkcms_is_installed()) {
            $this->redirect('/install.php');
        }
        $Config = hk_cache("Config");
        self::$Cache['Config'] = $Config;
        $config_siteurl = $Config['siteurl'];

        if (isModuleInstall('Domains')) {
            $parse_url = parse_url($config_siteurl);
            $config_siteurl = (is_ssl() ? 'https://' : 'http://') . "{$_SERVER['HTTP_HOST']}{$parse_url['path']}";
        }
        defined('CONFIG_SITEURL_MODEL') or define('CONFIG_SITEURL_MODEL', $config_siteurl);

        $this->assign("config_siteurl", $config_siteurl);
        $this->assign("Config", $Config);
    }

    /**
     * 验证码验证
     * @param string $verify 验证码
     * @param string $type 验证码类型
     * @return boolean
     */
    static public function verify($verify, $type = "verify")
    {
        return (new Checkcode)->validateCode($type, $verify);
    }

    /**
     * 分页输出
     * @param integer $total 信息总数
     * @param int $size
     * @param int $number
     * @param array $config
     * @return mixed
     */
    protected function page($total, $size = 0, $number = 0, $config = array()) {
        return page($total, $size, $number, $config);
    }

    /**
     * 返回模型对象
     * @param string $model
     * @return object|string
     */
    protected function getModelObject($model)
    {
        if (is_string($model) && strpos($model, '/') == false) {
            $model = Db(ucwords($model));
        } else if (!is_object($model) && strpos($model, '/') && is_string($model)) {
            $model = model($model);
        } else if (is_object($model)) {
            return $model;
        } else {
            $model = Db();
        }
        return $model;
    }

    /**
     * 基本信息分页列表方法
     * @param string|object $model 可以是模型对象，或者表名，自定义模型请传递完整（例如：Content/Model）
     * @param string|array $where 条件表达式
     * @param string $order 排序
     * @param integer $limit 每次显示多少
     * @return string
     */
    protected function basePage($model, $where = '', $order = '', $limit = 20)
    {
        $model = $this->getModelObject($model);
        $count = $model->where($where)->count();
        $page = $this->page($count, $limit);
        $data = $model->where($where)->order($order)->limit($page->firstRow . ',' . $page->listRows)->select();
        $this->assign('Page', $page->show());
        $this->assign('data', $data);
        $this->assign('count', $count);
        return $this->fetch();
    }

    /**
     * Ajax方式返回数据到客户端
     * @access protected
     * @param mixed $data 要返回的数据
     * @param String $type AJAX返回数据格式
     * @param int $json_option 传递给json_encode的option参数
     * @return void
     */
    protected function ajaxReturn($data,$type='',$json_option=0)
    {
        $data['state'] = !empty($data['status']) ? "success" : "fail";
        if(empty($type)) $type  =   config('default_ajax_return');
        switch (strtoupper($type)){
            case 'JSON' :
                // 返回JSON数据格式到客户端 包含状态信息
                header('Content-Type:text/html; charset=utf-8');
                exit(json_encode($data,$json_option));
            case 'XML'  :
                // 返回xml格式数据
                header('Content-Type:text/xml; charset=utf-8');
                exit(xml_encode($data));
            case 'JSONP':
                // 返回JSON数据格式到客户端 包含状态信息
                header('Content-Type:application/json; charset=utf-8');
                $handler  =   isset($_GET[config('var_jsonp_handler')]) ? $_GET[config('var_jsonp_handler')] : config('default_jsonp_handler');
                exit($handler.'('.json_encode($data,$json_option).');');
            case 'EVAL' :
                // 返回可执行的js脚本
                header('Content-Type:text/html; charset=utf-8');
                exit($data);
            default     :
                // 用于扩展其他返回格式数据
                Hook::listen('ajax_return', $data);
        }
    }
}